package edu.codink.common.base;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;

public interface IBasicService
{
	public <T extends Serializable>boolean save(T obj);
	
	public <T extends Serializable>boolean saveOrUpdate(T obj);
	
	public <T extends Serializable>boolean update(T obj);
	
	public <T extends Serializable>boolean saveOrUpdateAll(List<T> list);
	
	public boolean updateByHqlQuery(String queryString,Object[] params);
	
	public void updateByHqlQuery(final String queryStr);
	
	public <T extends Serializable>boolean del(T obj);
	
	public <T extends Serializable>boolean delAll(List<T> list);
	
	public <T extends Serializable>void delAll(Class<T> clazz);
	
	public <T extends Serializable>boolean delById(Class<T> clazz,Serializable id);
	
	public void delByHqlQuery(String queryString,Object[] parameters);
	
	public <T extends Serializable>List<T> findAll(Class<T> clazz);
	
	public <T extends Serializable>T load(Class<T> clazz,Serializable id);
	
	public <T extends Serializable>T get(Class<T> clazz,Serializable id);
	
	public <T>List<T> findBySQL(final String sql);
	
	public <T>List<T> findHql(String hql,Class<T> entityClass);
	
	public <T extends Serializable>T findOneHql(final String hql,Object[] params,final Class<T> entityClass);
	
	/**
	* 删除对象信息
	* @param obj
	*/
	public <T extends Serializable>void remove(T obj);
	
	/**
	 * 根据指定的CLASS及主键ID，删除对象的基本信息
	 * @param clazz
	 * @param id
	 */
	public <T extends Serializable>void remove(Class<T> clazz,final Serializable id);
	
	/**
	* 查询某类对象所有的数据
	* @param <T>
	* @param clazz
	* @return
	*/
	public <T extends Serializable>List<T> findAll(Class<T> clazz,String orderBy);
	
	public <T>List<T> findBySQL(final String sql,final Class<T> entityClass);
	
	public <T>List<T> findByNamedQuery(String queryName);
	
	public <T>List<T> findByNamedQuery(String queryName,Object[] params);
	
	public <T extends Serializable>T findOneHql(final String hql,final Class<T> entityClass);
	
	/**
	 * 通过SQL的方式更新数据
	 * @param sql
	 * @param params
	 * @return
	 */
	public int updateOrDelBySql(final String sql,final List<Object> params);
	
	/**
	 * 通过SQL查询单个对象
	 * @param <T>
	 * @param sql
	 * @param params
	 * @return
	 */
	public Object selectObjBySql(String sql,Object...params);
	
	/**
	 * 加载单个对象
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @return
	 */
	public <T extends Serializable>T find(Class<T> clazz,final Serializable id);
	
	/**
	 * 获得Query
	 * @param hql
	 * @return
	 * zhangliang
	 * 2011-8-1
	 */
	public Query createHqlQuery(String hql);
	
	public void flush();
	
	public <T extends Serializable>T merge(T t);
	
	/**
	 * 通过HQL的方式进行数据查询，并进行分页
	 * @param hql HQL语句
	 * @param page 分布对象
	 * @param params 参数对象
	 * @return
	 */
	public <T>List<T> selectByPageHql(final String hql,final Page page,final Object...params);
	
	/**
	 * 通过HQL的方式进行数据查询，并进行分页
	 * @param hql HQL语句
	 * @param page 分布对象,通过limit、start来查询分页
	 * @param params 参数对象
	 * @return
	 */
	public <T>List<T> selectByStartLimitPageHql(final String hql,final Page page,final Object...params);
	
	/**
	 * 通过HQL的方式查询数量
	 * @param sql
	 * @param params
	 * @return
	 */
	public long hqlCount(String hql,Object...params);
	
	/**
	 * 通过HQL的方式更新数据
	 * @param hql
	 * @param params
	 * @return
	 */
	public int updateOrDelByHql(final String hql,final Object...params);
	
	@SuppressWarnings("unchecked")
	public List findHql(String hql);
	
	public <T>List<T> findHql(String queryString,final Object[] params);
	
	/**
	 * 通过HQL的方式进行数据查询
	 * @param hql HQL语句
	 * @param clazz 查询结果对应的CLASS
	 * @param params 参数对象
	 * @return
	 */
	public <T>List<T> selectAllByHql(String hql,Object...params);
	
	/**
	 * 通过HQL的方式进行数据查询，并进行分页
	 * @param hql HQL语句
	 * @param clazz 查询结果对应的CLASS
	 * @param page 分布对象
	 * @param params 参数对象
	 * @return
	 */
	public <T>List<T> selectByPageSql(final String sql,final Page page,final Object...params);
	
	/**
	 * 通过SQL的方式进行数据查询，并进行分页
	 * @param sql SQL语句
	 * @param clazz 查询结果对应的CLASS
	 * @param page 分布对象
	 * @param params 参数对象
	 * @return
	 */
	public <T>List<T> selectByStartLimitPageSql(final String sql,final Page page,final Object...params);
	
	/**
	 * 通过SQL的方式进行数据查询
	 * @param hql HQL语句
	 * @param clazz 查询结果对应的CLASS
	 * @param params 参数对象
	 * @return
	 */
	public <T>List<T> selectAllBySql(String sql,Object...params);
	
	/**
	 * 通过SQL的方式更新数据
	 * @param sql
	 * @param params
	 * @return
	 */
	public int updateOrDelBySql(String sql,Object...params);
}
